import { reactive } from "vue";

export const userType = {
  all: 0,
  inner: 1,
  outer: 2,
};

// 临时固定值，也可从远程接口获取
export const userTypes = [
  {
    label: "全部",
    value: userType.all,
  },
  {
    label: "内部",
    value: userType.inner,
  },
  {
    label: "外部",
    value: userType.outer,
  },
];

export const getUserTypeLabel = (value) => {
  const item = userTypes.find((item) => item.value === value);
  return item ? item.label : "undefined";
};

// 此处仅为便于演示，而设定为全局性响应式对象，共几个vue组件共享数据变化。大型项目建议使用 pinia 来管理和共享全局/跨组件的变量。
// 用户列表，为简化逻辑，这里使用全局变量，来存储用户数据。
const userList = reactive([
  {
    username: "user1",
    email: "email1@qq.com",
    password: "1234",
    type: 1,
  },
  {
    username: "user2",
    email: "email2@qq.com",
    password: "1234",
    type: 2,
  },
  {
    username: "user3",
    email: "email3@qq.com",
    password: "1234",
    type: 2,
  },
  {
    username: "user4",
    email: "email4@qq.com",
    password: "1234",
    type: 1,
  },
]);

/**
 * 获取用户列表
 * @returns 返回当前的响应式的数组
 */
export function fetchUsers() {
  return userList;
}

/**
 * 注册用户
 * @param  user 用户对象
 * @param  callback 执行完注册动作后，回调函数
 */
export function registUser(user, callback) {
  userList.push(user);
  if (callback && typeof callback === "function") {
    callback();
  }
}

/**
 * 替换/初始化数组
 * @param {*} users
 */
export function replaceUsers(users) {
  userList.splice(0, userList.length, ...users); // 通过响应式代理替换
}

/**
 * 从数组中删除用户，根据用户名删除
 * @param username 用户名
 * @returns 返回操作是否成功
 */
export function deleteByUsername(username) {
  // 真实场景，应是调用远程接口发送删除用户的请求，根据响应的处理结果来决定是否更新本地数据。
  // 这里直接从本地删除
  const index = userList.findIndex((user) => user.username === username);
  if (index !== -1) {
    // splice 函数能被 vue 检测到，因此这是一个响应式操作。
    userList.splice(index, 1); // 删除找到的用户
  }
  return true;
}

/**
 * 验证用户登录信息
 * @param username 账号
 * @param password 密码
 * @param callback 回调函数
 */
export function verify(username, password, callback) {
  // Array.prototype.some()：
  // •	这个方法会检查数组中是否至少有一个元素符合给定的条件，并且返回 true 或 false。
  // •	在这里，条件是 user.username === username && user.password === password。
  const result = userList.some(
    (user) => user.username === username && user.password === password
  );

  if (callback && typeof callback === "function") {
    // 如果通过验证，检查是否有回调函数，如果有则执行
    callback(result /* 其他所需要的参数 */);
  } else {
    console.log.error("无效的回调函数参数!");
  }
}

// 导出当前JS模块为一个对象，供外部引入。
export default {
  verify,
  registUser,
  fetchUsers,
  deleteByUsername,
  replaceUsers,
};
